package com.molichuxing.services.infrastructure.dao;

import com.molichuxing.framework.dao.RootMapper;
import com.molichuxing.services.infrastructure.bean.EnterpriseScheduleBean;
import org.apache.ibatis.annotations.Param;

import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.List;
import java.util.Map;

public interface EnterpriseScheduleMapper extends RootMapper<EnterpriseScheduleBean> {

    /**
     * 根据条件分页查询count
     *
     * @param params
     * @return
     */
    long getPageCount(@Param("params") Map<String, Object> params);

    /**
     * 根据条件分页查询
     *
     * @param params
     * @param pageNum
     * @param pageSize
     * @return
     */
    List<EnterpriseScheduleBean> getPage(@Param("params") Map<String, Object> params, @Param("pageNum") int pageNum,
                                         @Param("pageSize") int pageSize);

    /**
     * 排期数量
     *
     * @return
     */
    int getScheduleCount();

    /**
     * 逾期数量
     *
     * @return
     */
    int getScheduleOverdueCount();

    /**
     * 获取排期信息
     *
     * @param scheduleIds
     * @return
     */
    List<EnterpriseScheduleBean> getScheduleByScheduleIds(@Param("scheduleIds") List<Integer> scheduleIds);

    /**
     * 终止订单排期
     *
     * @param orderCode        订单号
     * @param noPayState       未付款状态
     * @param terminationState 终止状态
     * @return
     */
    int modifyTermination(@Param("orderCode") Long orderCode, @Param("noPayState") int noPayState,
                          @Param("terminationState") int terminationState);

    /**
     * 根据订单号和期数获取企业订单排期信息
     *
     * @param orderCode 订单号
     * @param periods   期数
     * @return EnterpriseScheduleBean
     */
    EnterpriseScheduleBean getByOrderCodeAndPeriods(@Param("orderCode") Long orderCode,
                                                    @Param("periods") int periods);

    /**
     * 根据订单号获取企业订单排期信息
     *
     * @param orderCode 订单号
     * @param state     还款状态
     * @return List
     */
    List<EnterpriseScheduleBean> getByOrderCode(@Param("orderCode") Long orderCode, @Param("state") Integer state);

    /**
     * 还款修改状态
     *
     * @param scheduleId   排期id
     * @param alreadyState 已还状态
     * @param noPayState   未还状态
     * @return int
     */
    int modifyRepay(@Param("scheduleId") Integer scheduleId, @Param("arrivalAmount") BigDecimal arrivalAmount,
                    @Param("payTime") LocalDateTime payTime,
                    @Param("alreadyState") int alreadyState,
                    @Param("noPayState") int noPayState);

    /**
     * 查询当前应还排期
     *
     * @param orderCode  订单号
     * @param noPayState 未还状态
     * @return EnterpriseScheduleBean
     */
    EnterpriseScheduleBean getCurrent(@Param("orderCode") Long orderCode, @Param("noPayState") int noPayState);

    /**
     * 根据订单获取排期
     *
     * @param orderCodes
     * @return
     */
    List<EnterpriseScheduleBean> getByOrderCodes(@Param("orderCodes") List<Long> orderCodes);

}